unit uBanco;

interface

uses
  System.SysUtils, System.Generics.Collections, uConta, uExceptionContaInvalida,
  uExceptionValorMuitoAlto;

type
  TBanco = class
    private
      FNome : String;
      FContas : TList<TConta>;
    public
      property Nome : String read FNome write FNome;
      property Contas : TList<TConta> read FContas write FContas;

      procedure CriarConta(Senha : String; Saldo : double);
      procedure Saque(NumeroConta : integer; Senha : String; ValorSaque : double);
      constructor create(Nome : String);
  end;

implementation

{ TBanco }

constructor TBanco.create(Nome: String);
begin
  self.Nome := Nome;
  Contas := TList<TConta>.Create;
end;

procedure TBanco.CriarConta(Senha: String; Saldo: double);
var
  NumConta : integer;
  ContaNova : TConta;
begin
  try
    Randomize;
    ContaNova := TConta.Create(Senha, Saldo);
    NumConta := Random(1000);
    ContaNova.NumeroConta := NumConta;
    self.Contas.Add(ContaNova);
  except
    On E: Exception do
      raise;
  end;
end;

procedure TBanco.Saque(NumeroConta: integer; Senha: String; ValorSaque: double);
var
  IndiceObjeto : integer;
  ContaSaque : TConta;
begin
  IndiceObjeto := self.Contas.IndexOf(TConta.Create(NumeroConta));
  if IndiceObjeto = -1 then
    raise EContaInvalida.Create(NumeroConta, now);
  if ValorSaque > self.Contas[IndiceObjeto].Saldo then
    raise EValorMuitoAlto.Create(self.Contas[IndiceObjeto].Saldo, ValorSaque, 'Valor do saque maior que o saldo.');

  ContaSaque := self.Contas[IndiceObjeto];
  ContaSaque.Saque(Senha, ValorSaque);
end;

end.
